#include "SDL.h"
#include <stdlib.h>
#include <iostream>
#include <SDL_image.h>
//#include <SDL_mixer.h>
//#include <SDL_TTF.h>
using namespace std;

#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "SDL_image.lib")
//#pragma comment(lib, "SDL_mixer.lib")
//#pragma comment(lib, "SDL_TTF.lib")

void iniciar();
void ler_fase();
void ler_Sophia();
void desenhar();
void tabela();
void anima(int x, int y, int n, int l);
void mover();
void colid();
bool Colidiu (SDL_Rect object1, SDL_Rect object2) ;
bool ColidiuCorPreta (SDL_Surface *surface, int x, int y);
void animar();

const int LARGURA = 800;
const int ALTURA = 600;
const int BPP = 0;
const int FLAG = SDL_ANYFORMAT;

SDL_Surface* janela;
SDL_Surface* fundo;
SDL_Surface* camada1;
SDL_Rect retangulo;
SDL_Rect fase;
SDL_Rect fundoI;
SDL_Rect fundoD;
SDL_Surface* Sophia;
SDL_Rect Sophia_ori;
SDL_Rect Sophia_dest;
//Mix_Music* fase;
int cor;
int anima_sophia[15][2][2];
int tela;
//int animacao_sophia = 0;
/*bool cima;
bool baixo;*/
bool esquerda;
bool direita;
//bool pulo;
bool tela_cheia = false;
bool animado;
long tempo = 0;
long tempo2 = 0;

int main(int argc, char **argv)
{
	iniciar();
	tabela();
	ler_fase();
	ler_Sophia();
	SDL_Event event;
	do
	{
		if (SDL_PollEvent(&event))
		{
			switch(event.type)
			{
				case SDL_QUIT:
					exit(0);
					break;
				case SDL_KEYUP:
					switch(event.key.keysym.sym)
					{
						/*case SDLK_w:
							animado=false;
							Sophia_ori.x=0;
							Sophia_ori.y=540;
							Sophia_dest.y = 200;
							Sophia_dest.x = 230;
							//cima=false;
							break;
						/*case SDLK_s:
							animado=false;
							baixo=false;
							break;*/
						case SDLK_a:
							esquerda=false;
							break;
						case SDLK_d:							
							direita=false;
							break;/*
						case SDLK_SPACE:
							animado=false;
							pulo=false;
							break;*/
					}
					break;
				case SDL_KEYDOWN:
					switch(event.key.keysym.sym)
					{
						case SDLK_w:
							animado=true;
							//cima=true;
							
							break;/*
						case SDLK_s:
							animado=true;
							baixo=true;
							Sophia_ori.x=65;
							Sophia_ori.y=0;
							break;*/
						case SDLK_a:
							esquerda = true;
							break;
						case SDLK_d:
							direita = true;						
							break;/*
						case SDLK_SPACE:
							animado=true;
							pulo=true;
							Sophia_ori.x=0;
							Sophia_ori.y=0;
							break;*/
						case SDLK_ESCAPE:
							exit(0);
							break;
						case SDLK_END:
							if(tela_cheia)
							{
								janela = SDL_SetVideoMode(LARGURA, ALTURA, BPP, FLAG);
							}
							else
							{
								janela = SDL_SetVideoMode(LARGURA, ALTURA, BPP, FLAG | SDL_FULLSCREEN);
							}
							tela_cheia = !tela_cheia;
							break;
					}
					break;
			}
		}
	animar();
	desenhar();
	mover();
	colid();
	}
	while(1);
	return 0;
}

void iniciar()
{
	putenv("SDL_VIDEO_CENTERED=1");
	SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);

	atexit(SDL_Quit);

	janela = SDL_SetVideoMode(LARGURA, ALTURA, BPP, FLAG);

	SDL_ShowCursor(SDL_DISABLE);
}

void ler_fase()
{
	camada1 = IMG_Load("\imagens\\fase1.png");
	fundo = IMG_Load("\imagens\\fundo_fase1.png");
	/*fase = Mix_LoadMUS();
	Mix_VolumeMusic();
	Mix_PlayMusic();*/
	fundoI.x = 0;
	fundoI.y = 0;
	fundoI.w = 800;
	fundoI.h = 600;

	fundoD.x = 0;
	fundoD.y = 0;

	retangulo.x = 0;
	retangulo.y = 600;
	retangulo.w = 800;
	retangulo.h = 600;
	fase.x = 0;
	fase.y = 0;

	//letras15 = TTF_OpenFont();
}

void desenhar()
{
	SDL_BlitSurface (fundo, &fundoI, janela, &fundoD);
	SDL_BlitSurface(camada1,&retangulo,janela,&fase);
	SDL_BlitSurface(Sophia,&Sophia_ori,janela,&Sophia_dest);
	SDL_UpdateRect(janela, 0, 0, 0, 0);
}

void ler_Sophia()
{
	Sophia = IMG_Load("\imagens\\sophia.png");
	Sophia_ori.x = 0;
	Sophia_ori.y = 540;
	Sophia_ori.w = Sophia_dest.w = 140;
	Sophia_ori.h = Sophia_dest.h = 180;

	Sophia_dest.y = 330;
	Sophia_dest.x = 230;
}

void mover()
{
	/*if(cima)
	{
		Sophia_dest.y-=20;
	}
	if(baixo)
	{
		Sophia_dest.y+=20;
	}*/
	if(esquerda)
	{
		//anima(anima_sophia[1][0][0], anima_sophia[1][1][0], anima_sophia[1][0][1], anima_sophia[1][1][1]);		
		//if (SDL_GetTicks()> tempo2)
		//{
			Sophia_dest.x -=10;//movimento da sophia
			if (Sophia_dest.x <= 100)
			{
				fundoI.x -=2;
				retangulo.x -=10;
			}
			//tempo2 = SDL_GetTicks()+2;
		//}
	}
	
	if(direita)
	{
		//anima(anima_sophia[0][0][0], anima_sophia[0][1][0], anima_sophia[0][0][1], anima_sophia[0][1][1]);
		//if (SDL_GetTicks()> tempo2)
		//{
			Sophia_dest.x +=10;
			if (Sophia_dest.x >= 560)
			{
				fundoI.x +=2;
				retangulo.x +=10;
			}
		//	tempo2 = SDL_GetTicks()+2;
		//}
	}
}

void anima(int x, int y, int n, int l)
{
	int frame;
	frame = n-1;
	tela = n;
	Sophia_ori.x = x;
	Sophia_ori.y = y;
	if (SDL_GetTicks() > tempo && n >= 0)
	{
		Sophia_ori.x = (l * (tela - frame));
		tempo = SDL_GetTicks() + 100;
		frame--;
	}
	if (tela <= 0)
		tela = n;

}
void colid()
{
	if (fundoI.x >263)
		fundoI.x = 263;
	if (fundoI.x <0)
		fundoI.x = 0;
	if (retangulo.x >(3200))
		retangulo.x = 3200;
	if (retangulo.x <0)
		retangulo.x =0;
	if(Sophia_dest.x >(560))//LARGURA - Sophia_ori.w
	{
		Sophia_dest.x = 560;
	}
	if(Sophia_dest.y >(ALTURA - Sophia_ori.h))
	{
		Sophia_dest.y = ALTURA - Sophia_ori.h; 
	}
	if(Sophia_dest.x < 100)
	{
		Sophia_dest.x = 100;
	}
	if(Sophia_dest.y < 0)
	{
		Sophia_dest.y = 0;
	}
	
}
void tabela()
{
	anima_sophia[0][0][0]=0;//x
	anima_sophia[0][1][0]=540;//y
	anima_sophia[0][0][1]=8;//frame
	anima_sophia[0][1][1]=140;//largura do frame

	anima_sophia[1][0][0]=0;//x
	anima_sophia[1][1][0]=720;//y
	anima_sophia[1][0][1]=8;//frame
	anima_sophia[1][1][1]=140;//largura do frame
}

bool Colidiu (SDL_Rect object1, SDL_Rect object2) 
{
	int left1, left2;
    int right1, right2;
    int top1, top2;
    int bottom1, bottom2;
    left1   = object1.x;
    left2   = object2.x;
    right1  = object1.x + object1.w;
    right2  = object2.x + object2.w;
    top1    = object1.y;
    top2    = object2.y;
    bottom1 = object1.y + object1.h;
    bottom2 = object2.y + object2.h;
    if (bottom1 < top2) return(false);        // 1
    if (top1 > bottom2) return(false);        // 2
    if (right1 < left2) return(false);        // 3
    if (left1 > right2) return(false);        // 4
    return(true);
}


bool ColidiuCorPreta (SDL_Surface *surface, int x, int y)
{
	SDL_PixelFormat* fmt;
	SDL_Color Cor;
	Uint8* index;
	Uint32 col = 0 ;							
	fmt = surface->format;
	if(fmt->BitsPerPixel!=8)
	{
	  fprintf(stderr, "Not an 8-bit surface.\n");
	}
	else
	{
		SDL_LockSurface(surface);
		index = (Uint8 *)surface->pixels + y * surface->pitch + x;
		memcpy ( &col , index , surface->format->BytesPerPixel ) ;
		SDL_GetRGB ( col , surface->format , &Cor.r , &Cor.g , &Cor.b ) ;
		SDL_UnlockSurface(surface);
//			printf("Cor do pixel = Red: %d, Green: %d, Blue: %d. Posicao = X: %d, Y: %d, INDEX: %d\n",
//				  Cor.r, Cor.g, Cor.b, x, y, index);
	}
		if (Cor.r == 0 & Cor.g == 0 & Cor.b == 0)
		{
			return(1);
		}
		else
		{
			return(0);
		}
}

void animar()
{
	/*
	if (personagem.movendo_direita)
		{
			if (SDL_GetTicks()>personagem.tempo_movendo_direita)
			{
				personagem.quadro.x = personagem.quadro.w * personagem.tela_movendo_direita;
				personagem.quadro.y = 66;
				personagem.tempo_movendo_direita = SDL_GetTicks() + personagem.qtd_tempo_movendo_direita;
				personagem.tela_movendo_direita++;
				if (personagem.tela_movendo_direita >= personagem.qtd_telas_movendo_direita) 
				{
					personagem.tela_movendo_direita = 0;
				}
			
			}
		}
	*/
}
